#include <REGX52.H>

/**
1个数码管由8个LED组成，需要连接10根线，其中8根正极，2根负极(共用)
4个1组数码管，需要连接12根线，其中8根正极，4根负极
脚位如下，其中12/9/8/6号引脚是负极各控制1个数码管(从左到右)
  12....7
  8.8.8.8
  1.....6
正极走线如下所示，从最上方顺时针旋转编号a-f，中间为g，小数点为dp，连接的引脚是距离最近的
      a11
      ----
   f |    | b
  10 | g5 | 7
      ----
   e |    | c
   1 |    | 4
      ----.
      d2  dp3
其中74HC245芯片是显示/读取数码管的数字，并且供电的；DIR引脚是控制显示/读取，当接高电平时显示，反之
他的P0~P7引脚分别连接a~f和dp灯
如果要显示数字6，则应该a/c/d/e/f/g亮，b/dp灭，对应P0~P7二进制应该为1011 1110，按照高位读取是0111 1101，即为0x7D
如果要显示多个数字，需要循环给负极引脚通电，由于速度很快，人眼是看不出来闪烁的
其中74HC138芯片是控制给哪个负极引脚供电的，并且可以实现3个引脚(P22/P23/P23寄存器)控制8个数码管
P23/P22/P21从高位到低位，当为001时，Y1口为0，其他为1，2号数码管显示
*/

/**
数码管显示数字，分别对应数值0~9
*/
unsigned char nixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

/**
定义数码管显示位置和数字
*/
void nixie(unsigned char location, unsigned char number)
{
  // 显示数字
  P0 = nixieTable[number];
  // 显示位置
  switch (location)
  {
  case 1:
  {
    P2_4 = 1;
    P2_3 = 1;
    P2_2 = 1;
    break;
  }
  case 2:
  {
    P2_4 = 1;
    P2_3 = 1;
    P2_2 = 0;
    break;
  }
  case 3:
  {
    P2_4 = 1;
    P2_3 = 0;
    P2_2 = 1;
    break;
  }
  case 4:
  {
    P2_4 = 1;
    P2_3 = 0;
    P2_2 = 0;
    break;
  }
  case 5:
  {
    P2_4 = 0;
    P2_3 = 1;
    P2_2 = 1;
    break;
  }
  case 6:
  {
    P2_4 = 0;
    P2_3 = 1;
    P2_2 = 0;
    break;
  }
  case 7:
  {
    P2_4 = 0;
    P2_3 = 0;
    P2_2 = 1;
    break;
  }
  case 8:
  {
    P2_4 = 0;
    P2_3 = 0;
    P2_2 = 0;
    break;
  }
  }
}

void main()
{
  // 第6位显示3
  nixie(6, 3);
  while (1)
  {
  }
}
